package pinserver;

import com.twmacinta.util.MD5;
import eskuel.CMI_SQL;
import java.awt.Dimension;
import java.awt.Font;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Hashtable;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Main {

  public static JTextArea txtAr;
  public static boolean logprint = false;
  public static BufferedReader lees;
   public static  String tekst, ontvangen;
    public static PrintWriter schrijf;
    public static Socket client;

  public Main() {
    new BankServer();
  }

  public static void doeZend(String tekst) {
       schrijf.println(tekst);
      Main.drukaf("Verzenden = " + tekst);
    }

  public static void log(String wat, String txt) {
    Calendar kalender = Calendar.getInstance();
    String deDatum = calendarToString(kalender, "yyyy-MM-dd");
    String deTijd = calendarToString(kalender, "HH:mm:ss");
    //
    logboek("unknow", "INFO", wat, txt);
    //
    drukaf(deDatum + " " + deTijd + "|" + txt);
  }

  public static String bedragCheckStatus(String bedragStr, String banknummer, String rekeningnummer) {
    //TODO: bedragCheckStatus moet ook door servert !
    //throw new UnsupportedOperationException("MOET NOG !!!!");

    if (!banknummer.equals("24")) {
      return "A"; //Andere Bank
    }
    int bedrag = 0;
    String isOk = "N"; //N = nog niet gecheckt
    try {
      bedrag = Integer.parseInt(bedragStr);
      //getal is nu prima
      //nu nog of het deelbaar is door 5
      if (bedrag < 5) {
        return "L"; //Bedrag is te laag
      }
      if (bedrag % 5 == 0) {
        //ja is deelbaar door 5
        //nu nog kijken of saldo hoog genoeg is
        double saldo = Saldo.kijk(banknummer, rekeningnummer);
        //double saldo = saldoOpvragen(banknummer, rekeningnummer);
        if (bedrag <= saldo) {
          isOk = "J"; //JA
        } else {
          isOk = "S"; //saldo te laag
        }
      } else {
        isOk = "V"; //Niet deelbaar door 5
      }
    } catch (Exception e) {
      isOk = "F"; //numberFormatexception (bevat leters of zo)
    }
    return isOk;
  }

  public static void logboek(String deClass, String soort, String wat, String bericht) {
    CMI_SQL sql = new CMI_SQL(zooi.Settings.dbhost, zooi.Settings.dbname, zooi.Settings.dbpass);
    Calendar kalender = Calendar.getInstance();
    String deDatum = calendarToString(kalender, "yyyy-MM-dd");
    String deTijd = calendarToString(kalender, "HH:mm:ss");
    String extraInfo = ""; //+System.getProperties();
    String sqlQuery = "INSERT INTO `" + zooi.Settings.dblogtable + "` (`Log_id`, `ClassNaam`,`Soort`,`Wat`,`Bericht`,`Datum`,`Tijd`,`ExtraInfo`) VALUES (null,'" + deClass + "','" + soort + "','" + wat + "','" + bericht + "','" + deDatum + "','" + deTijd + "','" + extraInfo + "')";
    sql.insertQuery(sqlQuery);
    if (zooi.Settings.logprint) {
      System.out.println("'" + deClass + "','" + wat + "','" + bericht + "','" + deDatum + "','" + deTijd + "','" + extraInfo + "'");
    }
  }

  public static String calendarToString(Calendar calendar, String dateFormat) {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
    return simpleDateFormat.format(calendar.getTime());
  }

  public static java.awt.Dimension getSchermresolutie() {
    return java.awt.Toolkit.getDefaultToolkit().getScreenSize();
  }

  public static void drukaf(String str) {
    txtAr.setText(txtAr.getText() + "\n" + str);
    System.out.println(str);
  }

  public static void maakDingFrame() {
    //// dingFrame
    JFrame dingFrame = new JFrame();
    txtAr = new JTextArea();
    txtAr.setText("Lucky Bank Server");
    txtAr.setEditable(false);
    txtAr.setFont(new Font("Monospaced", Font.PLAIN, 12));
    JScrollPane sp = new JScrollPane(txtAr);
    sp.setAutoscrolls(true);
    dingFrame.add(sp);
    dingFrame.setSize(240, 400);
    //Slash de regel hieronder als je m niet wilt zien
    dingFrame.setVisible(true);
    Dimension d = getSchermresolutie();
    dingFrame.setLocation(d.width - 240, d.height - 400);
    dingFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //// einde dingFrame
  }

  public static void main(String[] args) {
    maakDingFrame();
    //De Server Starten
    new Main();
  }

  public static boolean checkGeblokeerd(String tBanknummer, String tPasnummer) {
//Pogingen
    int maxCodePogingen = 3;
    CMI_SQL sql = new CMI_SQL(Db.dbhost, Db.dbname, Db.dbpass);
    String sqlQuery;
    sqlQuery = "SELECT `Pogingen` FROM `b_pinpassen` WHERE `Pasnummer` = '" + tPasnummer + "'"; //opgingen
    drukaf(sqlQuery);
    ResultSet resPog = sql.selectieQuery(sqlQuery);
    int aantalPogingen = 0;
    try {
      /*while (resultaat.next()) {
      md5UitDB = resultaat.getString("MD5_Code");
      drukaf(md5UitDB);
      }*/
      if (resPog.next()) {
        aantalPogingen = resPog.getInt("Pogingen");
        drukaf("" + aantalPogingen);
      } else {
        drukaf("Staat niet in de DB !!");
      //hij return dalijk een f
      //als in pincode is fout
      }
    } catch (Exception e) {
      drukaf("Fout bij de DB. !!!!!!!!!!!!!!!!!!!\n" + e);
    }
    if (aantalPogingen >= maxCodePogingen) {
      //JOptionPane.showMessageDialog(null, "Te vaak FOUT ! pas is geblokkeert");
      return true;
    } else {
      return false;
    }
  }

  public static int getAantalCodePogingen(String tBanknummer, String tPasnummer) {
//Pogingen
    CMI_SQL sql = new CMI_SQL(Db.dbhost, Db.dbname, Db.dbpass);
    String sqlQuery;
    sqlQuery = "SELECT `Pogingen` FROM `b_pinpassen` WHERE `Pasnummer` = '" + tPasnummer + "'"; //opgingen
    drukaf(sqlQuery);
    ResultSet resPog = sql.selectieQuery(sqlQuery);
    int aantalPogingen = 0;
    try {
      /*while (resultaat.next()) {
      md5UitDB = resultaat.getString("MD5_Code");
      drukaf(md5UitDB);
      }*/
      if (resPog.next()) {
        aantalPogingen = resPog.getInt("Pogingen");
        drukaf("" + aantalPogingen);
      } else {
        drukaf("Staat niet in de DB !!");
      //hij return dalijk een f
      //als in pincode is fout
      }
    } catch (Exception e) {
      drukaf("Fout bij de DB. !!!!!!!!!!!!!!!!!!!\n" + e);
    }
    return aantalPogingen;
  }

  public static String checkPincode(String tBanknummer, String tPasnummer, String tPincode) {
    //Zelf via de MySQL Doen
    drukaf("--> checkPincode <--");
    //controleren en zo...
    if (tBanknummer.equals("24")) {
      drukaf("Hoort bij Lucky Bank ;-) !!");
      //Hoeft niet ff naar Equens
      //Verbinding maken de DB
      CMI_SQL sql = new CMI_SQL(Db.dbhost, Db.dbname, Db.dbpass);
      drukaf("Database...");
      String sqlQuery;
      //Pogingen
      if (checkGeblokeerd(tBanknummer, tPasnummer)) {
        return "te_veel_pogingen";
      }
      ///CODE
      sqlQuery = "SELECT `MD5_Code` FROM `b_pinpassen` WHERE `Pasnummer` = '" + tPasnummer + "'"; //md5pincode ophalen, om te check of het goed was
      drukaf(sqlQuery);
      ResultSet resultaat = sql.selectieQuery(sqlQuery);
      String md5UitDB = "";
      try {
        /*while (resultaat.next()) {
        md5UitDB = resultaat.getString("MD5_Code");
        drukaf(md5UitDB);
        }*/
        if (resultaat.next()) {
          md5UitDB = resultaat.getString("MD5_Code");
          drukaf(md5UitDB);
        } else {
          drukaf("Staat niet in de DB !!");
        //hij return dalijk een f
        //als in pincode is fout
        }
      } catch (Exception e) {
        drukaf("Fout bij de DB. !!!!!!!!!!!!!!!!!!!\n" + e);
      }
      // van de nu ingevulde code een MD5 maken
      MD5 md5 = new MD5();
      try {
        md5.Update(tPincode, null);
      } catch (Exception e) {
        drukaf("Het lukt niet om een MD5-code te maken...");
      }
      String hash = md5.asHex();
      //Vergelijken
      int aantalPogingen = getAantalCodePogingen(tBanknummer, tPasnummer);
      if (hash.equals(md5UitDB)) {
        drukaf("Pincode is Goed");
        sql.updateQuery("UPDATE `b_pinpassen` SET `Pogingen` = '0' WHERE `Pasnummer` = '" + tPasnummer + "'");
        return "goed"; //GOED
      } else {
        //FOUT
        drukaf("Pincode is Niet Goed");
        //Eerst in de DB ff eentje erbij
        sql.updateQuery("UPDATE `b_pinpassen` SET `Pogingen` = '" + (aantalPogingen + 1) + "' WHERE `Pasnummer` = '" + tPasnummer + "'");
        return "fout";
      }
    } else {
      // HIJ RETURNT HIER FALSE, WANT PINCODES BIJ ANDERE BANKEN REKENT IE STANDAARD FOUT
      //VOORLOPIG, ZOLANG EQUENS NOG NIET WERKT.
      drukaf("Er kan nog niet bij andere banken worden gepint");
      return "andere_bank"; //Andere Bank
    }
  //nog een false returnen, anders krijg je een compilation error
  //return 'y'; //zomaar iets
  //return ans;
  }
}

class BankServer {

  final int POORT = 8765;
  ServerSocket server;
  Socket client;
  ArrayList PinClientDingenLijst = new ArrayList();
  //
  public static Socket EQclient;
  public static String EQadres = "145.24.159.222";
  public static int EQpoort = 8665;
  public static Packet pak;
  public static BufferedReader EQlees;
  public static PrintWriter EQschrijf;
  public static Hashtable EQdata;
  public static int EQcounter = 0;

  public static void EQverbindserver(String adres, int poort) {
    try {
      EQclient = new Socket(adres, poort);
      //   verbonden = true;
      Main.drukaf("EQCLIENT: verbonden met server");
    } catch (Exception e) {
      Main.drukaf("EQCLIENT: server niet beschikbaar" + e);
      Main.drukaf("Server wordt gestopt ! Want Er is Geen EQUENS Verbinding");
      System.exit(0);
    }
  }

  public static void EQlogin(int banknummer) {
    try {
      Main.drukaf("EQlogin :P");
      pak.reset();
      pak.addHeader(Packet.Header.LOGIN);
      pak.addInt(banknummer);
      pak.rewind();
      pak.sendToServer(EQclient);
      Main.drukaf("EQCLIENT: LOGIN " + banknummer);
    } catch (Exception e) {
      Main.drukaf("EQ fout:\n" + e);
    }
  }

  public void EQmaakvars() {
    try {
      Main.drukaf("EQmaakvars :P");
      EQlees = new BufferedReader(new InputStreamReader(EQclient.getInputStream()));
      EQschrijf = new PrintWriter(EQclient.getOutputStream(), true);
      EQdata = new Hashtable();
      pak = new Packet();
      new EQOntvanger();
      Main.drukaf("variabelen gemaakt");
    } catch (Exception e) {
      Main.drukaf("EQ(maakvars) Fout:\n" + e);
    }
  }

  public BankServer() {
    //De Server Starten :P
    Main.drukaf("(constructor) BankServer :P");
    //Equens
    //EQverbindserver(EQadres, EQpoort);
    //EQmaakvars();
    //EQlogin(24);

    //Poort openzetten
    Main.log("BankServer (constructor)", "Server Wordt Gestart");
    try {
      server = new ServerSocket(POORT); //8765
    } catch (Exception e) {
      Main.log("BankServer (constructor)", "Poort niet beschikbaar, server geannuleerd");
      System.exit(0);
    }
    //Clients binnenlaten
    Main.log("BankServer (constructor)", "Server is gestart (poort: " + POORT + ")");
    while (true) {
      try {
        client = server.accept();
        //String adres1 = client.getInetAddress().toString();
        String adres2 = client.getRemoteSocketAddress().toString();
        Main.log("BankServer (constructor)", "Nieuwe client " + adres2 + " geaccepteerd");
        PinClientDinges pcd = new PinClientDinges(client);
        PinClientDingenLijst.add(pcd);
        new Thread(pcd).start();
      } catch (Exception e) {
        Main.log("BankServer (constructor)", "FOUT:\n" + e);
        System.exit(0);
      }
    }
  }

  /*
  public static void main(String[] args) {
  //   Wordt gestart via pinserver.Main.main(String[] args)
  new BankServer();
  }
   */
  public class PinClientDinges implements Runnable {

    

    public PinClientDinges(Socket s) {
      client = s;
    }

    public void run() {
      maakvariabelen();
      communiceerclient();
    }

    void maakvariabelen() {
      try {
        Main.schrijf = new PrintWriter(client.getOutputStream(), true);
        Main.lees = new BufferedReader(new InputStreamReader(client.getInputStream()));
      } catch (Exception e) {
        Main.log("maakvariablen", "FOUT:\n" + e);
      }
    }

    void communiceerclient() {
      //zend("0x01");
      //ontvangen = ontvang();
      Main.log("communiceerclient", "Start communicatie");
      while (!client.isClosed()) {
        Main.ontvangen = ontvang();
        inputVerwerken(Main.ontvangen);
      //broadcast("\"" + ontvangen + "\" reageer >: ");
      }
    }

    void inputVerwerken(String input) {
      //
      try {
        String[] dingen = input.split(" ");
        if (dingen[0].equalsIgnoreCase("saldo")) {
          zend("" + Saldo.kijk(dingen[1], dingen[2]));
        } else if (dingen[0].equalsIgnoreCase("ovsa")) {
          zend("ovsa " + Saldo.kijk(dingen[1], dingen[2]));
        } else if (dingen[0].equalsIgnoreCase("inlg")) {
          //Inloggen
          zend(inlgCheck(dingen[1]));
        } else if (dingen[0].equalsIgnoreCase("ctpn")) {
          String a = Main.checkPincode(dingen[1], dingen[2], dingen[3]);
          zend("ctpn " + a);
        } else if (dingen[0].equalsIgnoreCase("checkblok")) {
          String a = "";
          if (Main.checkGeblokeerd(dingen[1], dingen[2])) {
            a = "ja";
          } else {
            a = "nee";
          }
          zend("checkblok " + a);
        } else if (dingen[0].equalsIgnoreCase("bedragcheck")) {
          zend("bedragcheck " + Main.bedragCheckStatus(dingen[1], dingen[2], dingen[3]));
        } else if (dingen[0].equalsIgnoreCase("opnemen")) {
          zend("opnemen " + doeOpnemen(dingen[1], dingen[2], dingen[3], dingen[4]));
        } else if (dingen[0].equalsIgnoreCase("print")) {
          zend("print " + Saldo.kijk(dingen[1], dingen[2]));
        } else if (dingen[0].equalsIgnoreCase("start_trans")){
          //EQ ALARM !!!
          //Er is net een pasje ingevoerd van een andere bank !!
          Packet tPak = new Packet();
          tPak.reset();
          tPak.addHeader(Packet.Header.START_TRANSACTION);
          tPak.addInt(Integer.parseInt(dingen[1]));
          tPak.addInt(Integer.parseInt(dingen[2]));
          tPak.rewind();
          tPak.sendToServer(EQclient);
          zend("start_trans verzonden_naar_eq");
        }
      } catch (Exception e) {
        Main.log("Fout: ", "" + e);
      }
    }

    public int[] getAantalBiljetten(int bedrag) {
      int[] aantallen = new int[7];
      //ik ga voorlopig niet doen aan biljet keuze hoor.
      //5,10,20,50,100,200,500
      int dinges = bedrag;

      // ik hoop dat dit werkt xD

      aantallen[6] = dinges / 500;
      dinges = dinges - ((dinges / 500) * 500);

      aantallen[5] = dinges / 200;
      dinges = dinges - ((dinges / 200) * 200);

      aantallen[4] = dinges / 100;
      dinges = dinges - ((dinges / 100) * 100);

      aantallen[3] = dinges / 50;
      dinges = dinges - ((dinges / 50) * 50);

      aantallen[2] = dinges / 20;
      dinges = dinges - ((dinges / 20 * 20));

      aantallen[1] = dinges / 10;
      dinges = dinges - ((dinges / 10) * 10);

      aantallen[0] = dinges / 5;
      dinges = dinges - ((dinges / 5) * 5);

      //Dat Was M
      return aantallen;

    }

    public String doeOpnemen(String bedrag, String banknummer, String rekeningnummer, String automaatnummer) {
      String ans = "";
      Main.drukaf("doeOpnemen...");
      //Van rekening afhalen ( transactie toevoegen )
      String bedragCheck = Main.bedragCheckStatus(bedrag, banknummer, rekeningnummer);
      if (banknummer.equals("24")) {
        //Aantal biljetten in aanpassen
        int[] biljetten = getAantalBiljetten(Integer.parseInt(bedrag));
        String biljettenOk = biljettenAanpassenInDB(biljetten, automaatnummer);
        if (bedragCheck.equalsIgnoreCase("J") && biljettenOk.equalsIgnoreCase("ok")) {
          CMI_SQL sql = new CMI_SQL(Db.dbhost, Db.dbname, Db.dbpass);
          Main.drukaf("Database...");
          String sqlQuery = "INSERT INTO `b_transacties` (`RekeningNr`,`Code`,`Omschrijving`,`Bedrag`) VALUES ('" + rekeningnummer + "','GM','Geld opnemen bij een Geldautomaat','-" + bedrag + "');";
          //Transactie toevoegen
          sql.insertQuery(sqlQuery);
          ans = "ok";
        } else {
          ans = "FOUT!";
        }
      }
      return ans;
    }

    public String biljettenAanpassenInDB(int[] biljetten, String automaatnummer) {
      String ans = "";
      ans = "ok";
      Main.drukaf("biljettenAanpassenInDB...");
      CMI_SQL sql = new CMI_SQL(Db.dbhost, Db.dbname, Db.dbpass);
      Main.drukaf("Database...");
      String sqlQuery = "SELECT * FROM `b_biljetten` WHERE `Pinautomaat` = '" + automaatnummer + "'";
      ResultSet res = sql.selectieQuery(sqlQuery);
      int[] inDB = new int[7];
      try {
        while (res.next()) {
          inDB[0] = res.getInt("Aantal5");
          inDB[1] = res.getInt("Aantal10");
          inDB[2] = res.getInt("Aantal20");
          inDB[3] = res.getInt("Aantal50");
          inDB[4] = res.getInt("Aantal100");
          inDB[5] = res.getInt("Aantal200");
          inDB[6] = res.getInt("Aantal500");
        }
        //CHECK
        boolean checkIsOk = true;
        for (int loopi = 0; loopi <= 6; loopi++) {
          if (inDB[loopi] < biljetten[loopi]) {
            Main.drukaf("ONVOLDOENDE BILJETTEN");
            checkIsOk = false;
            break;
          }
        }
        //EINDE CHECK
        if (!checkIsOk) {
          ans = "niet_genoeg_biljetten";
          return ans;
        } else {
          //Aanpassen in dB
          for (int loopi = 0; loopi <= 6; loopi++) {
            inDB[loopi] -= biljetten[loopi];
          }
          sqlQuery = "UPDATE `b_biljetten` SET `Aantal5` = '" + inDB[0] + "', `Aantal10` = '" + inDB[1] + "', `Aantal20` = '" + inDB[2] + "', `Aantal50` = '" + inDB[3] + "', `Aantal100` = '" + inDB[4] + "', `Aantal200` = '" + inDB[5] + "', `Aantal500` = '" + inDB[6] + "' WHERE `Pinautomaat` = '" + automaatnummer + "'";
          Main.drukaf("Aanpassen in DB...");
          sql.updateQuery(sqlQuery);
        }
      } catch (Exception ex) {
        Main.drukaf("Fout bij DB in biljettenAanpassenInDB");
      }
      return ans;
    }

    public String inlgCheck(String automaatnummer) {
      //Standaard Goedrekenen
      //CHECK
      boolean isOk = true;
      if (isOk) {
        //
      } else {
        //
      }
      //EINDE CHECK
      return "inlg ok";
    }

    void arrayPrinter(String[] a) {
    }

    public void zend(String tekst) {
      Main.schrijf.println(tekst);
      Main.log("zend", "Verzenden = " + tekst);
    }

    public String ontvang() {
      String deTekst = "";
      try {
        deTekst = Main.lees.readLine();
        if (deTekst.equals("0x02")) {
          Main.log("ontvang", "Client gestopt (kreeg net 0x02 binnen)");
          client.close();
        } else {
          Main.log("ontvang", "Ontvangen = " + deTekst + " [" + deTekst.length() + "]");
        }
      } catch (Exception e) {
        Main.log("ontvang", "FOUT:\n" + e + "\nDe connectie met de Client wordt verbroken");
        try {
          client.close();
        } catch (Exception ex) {
          Main.log("FOut afhandeling", "Fout:\n(Een exception in een exception XD)\n" + ex);
        }
      }
      return deTekst;
    }

    void broadcast(String mes) {
      //Zend een bericht naar ALLE clients
      for (int i = 0; i < PinClientDingenLijst.size(); i++) {
        PinClientDinges b = (PinClientDinges) PinClientDingenLijst.get(i);
        b.zend(mes);
      }
    }
  }

  /*
   *
   *
   *
   * //////////////////////////////////////////////////////////////////////////////////////////////////////
   * ///////////////////EQUENS DINGEN//////////////////////////////////////////////////////////////////////
   * //////////////////////////////////////////////////////////////////////////////////////////////////////
   *
   *
   */
  public class EQOntvanger extends Thread {

    public EQOntvanger() {
      Main.drukaf("EQ Ontvanger Wordt Gestart");
      this.start();
    }
    public Packet paki;

    @Override
    public void run() {
      Main.drukaf("EQOntvanger: run");
      paki = new Packet();
      try {
        while (true) {
          paki.receiveFromServer(EQclient);
          Packet.Header h = paki.readHeader();
          //drukaf("EQ: " + h);
          if (h.equals(Packet.Header.LOGIN)) {
            Main.drukaf("EQ: LOGIN " + paki.readInt());
          } else if (h.equals(Packet.Header.ERROR)) {
            Packet.Error a = paki.readError();
            if (a.equals(Packet.Error.BANK_OFFLINE)) { //BANK_OFFLINE
              Main.drukaf("EQ: BANK_OFFLINE " + paki.readInt() + " " + paki.readInt());
            } else if (a.equals(Packet.Error.WRONG_ACCOUNT)) {
              Main.drukaf("EQ: WRONG_ACCOUNT " + paki.readInt() + " " + paki.readInt());
            } else if (a.equals(Packet.Error.WRONG_PIN)) {
              Main.drukaf("EQ: WRONG_PIN " + paki.readInt());
            } else if (a.equals(Packet.Error.ACCOUNT_LIMIT_REACHED)) {
              Main.drukaf("EQ: ACCOUNT_LIMIT_REACHED " + paki.readInt());
            } else if (a.equals(Packet.Error.DAY_LIMIT_REACHED)) {
              Main.drukaf("EQ: DAY_LIMIT_REACHED " + paki.readInt());
            } else if (a.equals(Packet.Error.CARD_BLOCKED)) {
              Main.drukaf("EQ: CARD_BLOCKED " + paki.readInt() + " " + paki.readInt());
            } ////
            else {
              //String b = getErrorNaam(a);
              Main.drukaf("EQ: ERROR " + a.toString());
            }
          //EINDE ERRORS
          } else if (h.equals(Packet.Header.START_TRANSACTION)) {
            //Een andere bank wil verbinding maken
            int andereBanknummer = paki.readInt();
            int hierRekeningnummer = paki.readInt();
            Main.drukaf("EQ: START_TRANSACTION " + andereBanknummer + " " + hierRekeningnummer);
            //Meteen checken en Respons Terugsturen
            //Kijken of Rekeningnummer bestaat
            CMI_SQL sql = new CMI_SQL(Db.dbhost, Db.dbname, Db.dbpass);
            ResultSet res = sql.selectieQuery("SELECT * FROM `b_rekeningen` WHERE `RekeningNr` = '" + hierRekeningnummer + "'");
            //boolean isOk=false;
            //als rekening niet bestaat of non-actief = false
            //Goed = true (DuH)
            int non = -1;
            try {
              while (res.next()) {
                non = res.getInt("NonActief");
              }
            } catch (Exception e) {
              Main.drukaf("EQ EQadres Fout:\n" + e);
            }
            if (non <= -1) {
              Main.drukaf("EQ Rekening bestaat niet");
            } else if (non >= 1) {
              Main.drukaf("EQ Rekening NonActief");
            } else if (non == 0) {
              Main.drukaf("EQ Rekening bestaat en is niet NonActief :-)");
              //IS GOED :-)
              paki.reset();
              paki.addHeader(Packet.Header.ACCEPT_TRANSACTION);
              paki.addInt(andereBanknummer);
              paki.addInt(hierRekeningnummer);
              paki.sendToServer(EQclient);
            }
          } else if (h.equals(Packet.Header.ACCEPT_TRANSACTION)) {
            int sessieNummer = paki.readInt();
            int andereBanknummer = paki.readInt();
            int hetRekeningnummer = paki.readInt();
            Main.drukaf("EQ: ACCEPT_TRANSACTION " + sessieNummer + " " + andereBanknummer + " " + hetRekeningnummer);
//            EQdata.add(new String[]{"" + sessieNummer, "" + andereBanknummer, "" + hetRekeningnummer, "", ""});
            EQdata.put(sessieNummer, new int[]{andereBanknummer, hetRekeningnummer});

            ////
            String foo = Integer.toString(hetRekeningnummer); //das rekeningnummer
              foo = foo.substring(0, 2);
              int afkomstbank = Integer.parseInt(foo);
              Main.drukaf("Bank waarvan de Rekeningnummer is:\n" + afkomstbank);
              if (afkomstbank != 24) {
                //Ik iemand met pasje van andere bank pint Via ons
                Main.doeZend("accept_trans ");
                //
              }
            ////
          } else if (h.equals(Packet.Header.CONTROL_PIN)) {
            Main.drukaf("Noot: control_pin heeft niet altijd hetzelde aantal args !");
            int sessieNummer = paki.readInt();
            String pincode = paki.readString();
            Main.drukaf("EQ: CONTROL_PIN " + sessieNummer + " " + pincode);
            int[] deEQdata = (int[]) EQdata.get(sessieNummer);
            if (deEQdata != null) {
              String foo = Integer.toString(deEQdata[1]); //das rekeningnummer
              foo = foo.substring(0, 2);
              int afkomstbank = Integer.parseInt(foo);
              Main.drukaf("Bank waarvan de Rekeningnummer is:\n" + afkomstbank);
              if (afkomstbank == 24) {
                //Hij vraagt dus aan MIJ of de code goed is.
                Main.drukaf("Hij vraagt dus aan MIJ of de code goed is.");
                String hetPasnummer = getPasnummer(deEQdata[1]);
                // checkPincode(24,hetPasnummer);
                String isGoed = Main.checkPincode(Integer.toString(24), hetPasnummer, pincode);
                if (isGoed.equalsIgnoreCase("goed")) {
                  paki.reset(); ////GOED
                  paki.addHeader(Packet.Header.CONTROL_PIN);
                  paki.addInt(sessieNummer);
                  paki.rewind();
                  paki.sendToServer(EQclient);
                  Main.drukaf("EQ Code is GOed volgens mij");
                } else if (isGoed.equalsIgnoreCase("fout")) {
                  paki.reset(); //// FOUT
                  paki.addHeader(Packet.Header.ERROR);
                  paki.addError(Packet.Error.WRONG_PIN);
                  paki.addInt(sessieNummer);
                  paki.rewind();
                  paki.sendToServer(EQclient);
                } else if (isGoed.equalsIgnoreCase("te_veel_pogingen")) {
                  paki.reset(); //GEBLOKT
                  paki.addHeader(Packet.Header.ERROR);
                  paki.addError(Packet.Error.CARD_BLOCKED);
                  paki.addInt(sessieNummer);
                  paki.rewind();
                  paki.sendToServer(EQclient);
                } else { //WEENI
                  paki.reset(); //IETS ANDERS
                  paki.addHeader(Packet.Header.ERROR);
                  paki.addError(Packet.Error.CARD_BLOCKED);
                  paki.addInt(sessieNummer);
                  paki.rewind();
                  paki.sendToServer(EQclient);
                }
              } else {
                //Ik krijg door dat de code Goed is :D
                Main.drukaf("Ik krijg door dat de code Goed is :D");
              }
            ////////////////////////////////////////////////////////////////////////////////
            ////////////////////////////////////////////////////////////////////////////////
            } else {
              Main.drukaf("EQ Ontvanger Foutje:\nsessieNummer staat niet in de LIJST (" + sessieNummer + ")");
            }
          } else if (h.equals(Packet.Header.REQUEST_AMOUNT)) {
            Main.drukaf("Noot: request_amount heeft niet altijd hetzelde aantal args !");
            int sessieNummer = paki.readInt();
            double getal = paki.readDouble();
            Main.drukaf("EQ: REQUEST_AMOUNT " + sessieNummer + " " + getal);
            int[] deEQdata = (int[]) EQdata.get(sessieNummer);
            if (deEQdata != null) {
              String foo = Integer.toString(deEQdata[1]); //das rekeningnummer
              foo = foo.substring(0, 2);
              int afkomstbank = Integer.parseInt(foo);
              Main.drukaf("Bank waarvan de Rekeningnummer is:\n" + afkomstbank);
              if (afkomstbank != 24) {
                //Ik krijg het saldo door van een andere bank
              } else {
                Main.drukaf("EQ Ik moet het saldo doorgeven");
                paki.reset();
                paki.addHeader(Packet.Header.REQUEST_AMOUNT);
                paki.addInt(sessieNummer);
                double hetSaldo = Saldo.kijk(Integer.toString(24), Integer.toString(deEQdata[1]));
                paki.addDouble(hetSaldo);
                paki.sendToServer(EQclient);
                Main.drukaf("EQ Zenden: Saldo = " + hetSaldo);
              }
            }
          } else if (h.equals(Packet.Header.PIN_AMOUNT)) {
            Main.drukaf("Noot: pin_amount heeft niet altijd hetzelde aantal args !");
            int sessieNummer = paki.readInt();
            double hetGetal = paki.readDouble();
            Main.drukaf("EQ: REQUEST_AMOUNT " + sessieNummer + " " + hetGetal);
            int[] deEQdata = (int[]) EQdata.get(sessieNummer);
            if (deEQdata != null) {
              String foo = Integer.toString(deEQdata[1]); //das rekeningnummer
              foo = foo.substring(0, 2);
              int afkomstbank = Integer.parseInt(foo);
              Main.drukaf("Bank waarvan de Rekeningnummer is:\n" + afkomstbank);
              if (afkomstbank == 24) {
                //geld van rekeningafhalen
                String isOk = hierOpnemenViaAnderBank(Integer.toString(deEQdata[1]), hetGetal);
                if (isOk.equalsIgnoreCase("ok")) {
                  paki.reset();
                  paki.addHeader(Packet.Header.PIN_AMOUNT);
                  paki.addInt(sessieNummer);
                  paki.rewind();
                  paki.sendToServer(EQclient);
                  Main.drukaf("Aangepast in de Database :D");
                } else {
                  Main.drukaf("EQ pinnen, saldo te laag HIERO");
                  paki.reset();
                  paki.addHeader(Packet.Header.ERROR);
                  paki.addError(Packet.Error.ACCOUNT_LIMIT_REACHED);
                  paki.addInt(sessieNummer);
                  //paki.rewind();
                  paki.sendToServer(EQclient);
                }
              }
            }
          } ///////
          else {
            Main.drukaf("EQ: " + h);
          }
        }
      } catch (Exception e) {
        Main.drukaf("EQ FOUT (EQOntvanger): " + e);
      }
    }

    /*public String[] getSessie(int sessieNummer) {
    for (int a = 0; a <= EQdata.size(); a++) {
    String[] test = (String[]) EQdata.get(a);
    if (test[0].equals("" + sessieNummer)) {
    //Zet op plek 3 in de array de index waar hij is gevonden
    test[3] = "" + a;
    return test;
    }
    }
    return null;
    }*/
    public String getPasnummer(int i) {
      CMI_SQL sql = new CMI_SQL(Db.dbhost, Db.dbname, Db.dbpass);
      ResultSet res = sql.selectieQuery("SELECT * FROM `b_pinpassen` WHERE `RekeningNr` = '" + i + "'");
      try {
        while (res.next()) {
          return res.getString("Pasnummer");
        }
      } catch (Exception e) {
      }
      return null;
    }

    public String hierOpnemenViaAnderBank(String foo, double hetGetal) {
      Main.drukaf("hierOpnemenViaAnderBank...");
      double hetSaldo = Saldo.kijk(Integer.toString(24), foo);
      if (hetSaldo >= hetGetal) {
        //Van rekening afhalen ( transactie toevoegen )
        CMI_SQL sql = new CMI_SQL(Db.dbhost, Db.dbname, Db.dbpass);
        Main.drukaf("Database...");
        String sqlQuery = "INSERT INTO `b_transacties` (`RekeningNr`,`Code`,`Omschrijving`,`Bedrag`) VALUES ('" + foo + "','GM','Geld opnemen bij een Geldautomaat','-" + hetGetal + "');";
        //Transactie toevoegen
        sql.insertQuery(sqlQuery);
        return "ok";
      } else {
        return "saldo te laag";
      }
    }


  }
}